package com.tanhua.server.service;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.tanhua.commons.key.RedisKeyConst;
import com.tanhua.domain.db.PageResult;
import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mg.Comment;
import com.tanhua.domain.vo.CommentVo;
import com.tanhua.dubbo.api.PublishApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.mg.CommentApi;
import com.tanhua.dubbo.mg.VideoApi;
import com.tanhua.server.utils.RelativeDateFormat;
import com.tanhua.server.utils.ThreadLocalUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.bson.types.ObjectId;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class LinkedCommentService {
    @Reference
    private CommentApi commentApi;
    @Reference
    private UserInfoApi userInfoApi;
    @Reference
    private PublishApi publishApi;
    @Reference
    private VideoApi videoApi;
    //注入ThreadLocalUtils对象
    @Autowired
    private ThreadLocalUtils threadLocalUtils;
    //注入redisTemplate对象
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    //注入CommentService方法
    @Autowired
    private CommentService commentService;

    /**
     * 评论列表
     */
    public PageResult<CommentVo> getLinkedComment(Integer queryContextType,String movementId, Integer page, Integer pagesize) {
////      调用CommentApi的findPageById 返回PageResult<Comment>
        PageResult<Comment> commentPageResult = commentApi.findPageById(queryContextType,movementId, page, pagesize);
//      调用公共方法 传入commentPageResult对象 返回PageResultVo
        return getCommentVoPageResult("comment",commentPageResult);
    }

    /**
     * 小视频评论列表
     * @param queryContextType
     */
    public PageResult<CommentVo> videoLinkedCommentData(Integer queryContextType,String videoId, Integer page, Integer pagesize) {
        //      调用CommentApi的findPageById 返回PageResult<Comment>
        PageResult<Comment> commentPageResult = commentApi.findPageById(queryContextType,videoId, page, pagesize);
        //      调用公共方法 传入commentPageResult对象 查询用户信息 并封装数据 返回PageResultVo
        return getCommentVoPageResult("video",commentPageResult);
    }

    /**
     * 传入commentPageResult对象 返回PageResultVo
     * @param commentPageResult
     * @return
     */
    private PageResult<CommentVo> getCommentVoPageResult(String operatingTableType,PageResult<Comment> commentPageResult) {
        List<Comment> items = commentPageResult.getItems();
        // 4.获取items集合
        //5.创建一个存储CommentVo的集合
        List<CommentVo> commentVos = new ArrayList<>();
        if (!CollectionUtils.isEmpty(items)) {
//        6.遍历itmes集合
            for (Comment comment : items) {
                CommentVo commentVo = new CommentVo();
                //7.根据用户id 调用userInfoApi
                UserInfo userInfo = userInfoApi.findUserInfoByID(comment.getUserId());
                //8.封装数据返回
                BeanUtils.copyProperties(comment, commentVo);
                BeanUtils.copyProperties(userInfo, commentVo);
                //设置评论id
                commentVo.setId(comment.getId().toHexString());
                //评论时间
                commentVo.setCreateDate(RelativeDateFormat.format(new Date(comment.getCreated())));
                //是否点赞!!!
                //TODO 视频评论的点赞状态
                //commentVo.setHasLiked(0);
                isLinkedLike(operatingTableType,threadLocalUtils.getUserId().intValue(),commentVo);
                //添加到listVo
                commentVos.add(commentVo);
            }
        }
        //创建PageResult<CommentVo>
        PageResult<CommentVo> pageResultCommentVo = new PageResult<>();
        //复制属性
        BeanUtils.copyProperties(commentPageResult,pageResultCommentVo);
        //设置集合属性
        pageResultCommentVo.setItems(commentVos);
        return pageResultCommentVo;
    }

    /**
     * 提交自己的评论
     */
    public void submitComments(String publishId, String context) {
        //冗余作者id字段、评论的动态id、评论内容类型：1动态、评论类型：2评论
        Comment comment = commentService.packageComment(1, publishId, 1, 2);
        comment.setContent(context);//评论的内容是什么
        //插入评论表
        commentApi.save(comment);
    }

    //    小视频提交自己的评论
    public void submitVideoComments(String commendId, String context) {

        //冗余作者id字段、评论的动态id、评论内容类型：1动态、评论类型：2评论
        Comment comment = commentService.packageComment(1, commendId, 2, 2);
        comment.setContent(context);//评论的内容是什么
        //插入评论表
        commentApi.save(comment);
    }

    /**
     *  评论-点赞
     */
    public long getLinkedLikeCount(String commentId) {
        //调用公共方法
        Comment comment = commentService.packageComment(1, commentId, 3, 1);;
        //调用commentApi方法 传入id 返回long类型的点赞数量
        Integer linkedLikeCount=commentApi.save(comment);
        //用户看到的点赞状态也要设置
        //设置一个key 这里的点赞key一定要有唯一的标识 所以我们用传过来的评论表Id
        String key= RedisKeyConst.LINKED_LIKE_STATUS+threadLocalUtils.getUserId()+"_"+new ObjectId(commentId);
        //存入redis
        redisTemplate.opsForValue().set(key,"linked_like_status");
        //返回点赞数量
        return linkedLikeCount;
    }
    //  小视频评论-点赞
    public long getVideoLinkedLikeCount(String commendId) {
        //调用公共方法
        Comment comment = commentService.packageComment(1, commendId, 3, 1);;
        //调用commentApi方法 传入id 返回long类型的点赞数量
        Integer videoLinkedLikeCount=commentApi.save(comment);
        //设置一个key 这里的点赞key一定要有唯一的标识 所以我们用传过来的评论表Id
        String key= RedisKeyConst.VIDEO_LINKED_LIKE_STATUS+threadLocalUtils.getUserId()+"_"+new ObjectId(commendId);
        //存入redis
        redisTemplate.opsForValue().set(key,"video_linked_like_state");
        //返回点赞数量
        return videoLinkedLikeCount;
    }
    //  小视频评论-取消点赞
    public long getDisVideoLinkedLikeStatus(String commendId) {
        //调用公共方法
        Comment comment = commentService.packageComment(0, commendId, 3, 1);;
        //调用commentApi方法 传入id 返回long类型的喜欢数量
        Integer videoLikeCount=commentApi.remove(comment);
        //用户看到的视频喜欢状态也要设置！
        //设置一个key
        String key= RedisKeyConst.VIDEO_LINKED_LIKE_STATUS+threadLocalUtils.getUserId()+"_"+commendId;
        //删除redis
        redisTemplate.delete(key);
        //返回点赞数量
        return videoLikeCount;
    }
    /**
     * 点赞是否高亮显示的判断
     */
    public void isLinkedLike(String operatingTableType,
                             Integer id,CommentVo commentVo) {
        //默认是获取动态评论列表的点赞状态
        String key=RedisKeyConst.LINKED_LIKE_STATUS+id+"_"+commentVo.getId();
        if(operatingTableType.equals("video")){
            //如果是视频的动态评论列表 那么修改key
            key=RedisKeyConst.VIDEO_LINKED_LIKE_STATUS+id+"_"+commentVo.getId();
        }
        //判断redis中是否存在这个点过赞的键
        if(!StringUtils.isEmpty(redisTemplate.opsForValue().get(key))){
            commentVo.setHasLiked(1);
        }
        else{
            commentVo.setHasLiked(0);
        }
    }
    /**
     *  评论-取消点赞
     */
    public long disLinkedLikeStatus(String commentId) {
        //调用公共方法
        Comment comment = commentService.packageComment(0, commentId, 3, 1);;
        //调用commentApi方法 传入id 返回long类型的喜欢数量
        Integer disLinkedLikeCount=commentApi.remove(comment);
        //用户看到的视频喜欢状态也要设置！
        //设置一个key
        String key= RedisKeyConst.LINKED_LIKE_STATUS+threadLocalUtils.getUserId()+"_"+commentId;
        //删除redis
        redisTemplate.delete(key);
        //返回点赞数量
        return disLinkedLikeCount;
    }
}
